package com.fulu.jvm;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * 方法区，模拟OOM
 * 调优参数
 * # 设置堆内存
 * -Xmx4g -Xms4g
 * # 指定GC算法
 * XX:+UseG1GC -XX:MaxGCPauseMillis=50
 * # 指定GC并行线程数
 * -XX:ParallelGCThreads=4
 * # 打印GC日志
 * XX:+PrintGCDetails -XX:+PrintGCDateStamps
 * # 指定GC日志文件
 * -Xloggc:gc.log
 * # 指定Meta区的最大值-XX:MaxMetaspaceSize=2g
 * # 设置单个线程栈的大小
 * -Xss1m
 * 堆内存溢出时自动的日志dump，并指定路径，建议添加
 * -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/base
 */
public class MetaspaceOverFlowTest {

    /**
     * 通过CGLIB模拟向元空间写入数据
     */
    public static void main(String[] args) {
        while (true) {
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            Enhancer enhancer = new Enhancer();

            enhancer.setSuperclass(MetaspaceOverFlowTest.class);
            enhancer.setUseCache(false);  // 开启缓存，相同类的Klass将不再创建
            enhancer.setCallback(new MethodInterceptor() {
                public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
                    return proxy.invokeSuper(obj, args);
                }
            });

            System.out.println("running...");

            enhancer.create();
        }
    }
}